package com.example.fengyungo_user.utils;

import android.graphics.Color;
import android.graphics.Point;
import android.util.Log;

import androidx.fragment.app.FragmentActivity;

import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps2d.AMap;
import com.amap.api.maps2d.CameraUpdateFactory;
import com.amap.api.maps2d.UiSettings;
import com.amap.api.maps2d.model.BitmapDescriptorFactory;
import com.amap.api.maps2d.model.LatLng;
import com.amap.api.maps2d.model.Marker;
import com.amap.api.maps2d.model.MarkerOptions;
import com.amap.api.maps2d.model.MyLocationStyle;
import com.example.fengyungo_user.R;

/**
 * @author 徐
 */
public class MapUtils {
    private static final String TAG = "MapUtils";

    /**
     * 在地图中心点添加选点
     *
     * @param aMap AMap
     */
    public static void addCenterMarker(AMap aMap) {
        MarkerOptions options = new MarkerOptions();
        //对应Marker.setIcon方法  设置Marker的图片
        options.icon(BitmapDescriptorFactory.fromResource(R.drawable.loc));
        options.anchor(0.5F, 1);
        //拿到地图中心点的坐标。
        LatLng latLng = aMap.getCameraPosition().target;
        //把中心点的坐标转换成屏幕像素位置
        Point screenPosition = aMap.getProjection().toScreenLocation(latLng);
        //在地图上添加Marker并获取到Marker.
        Marker centerMarker = aMap.addMarker(options);
        //给marker设置像素位置。
        centerMarker.setPositionByPixels(screenPosition.x, screenPosition.y);
        centerMarker.setAnchor(0.5F, 1);
    }

    /**
     * 设置定位蓝点的Style
     */
    public static void setLocationStyle(AMap aMap) {
        //设置定位蓝点
        MyLocationStyle myLocationStyle;
        // 连续定位、且将视角移动到地图中心点，定位点依照设备方向旋转，并且会跟随设备移动。（1秒1次定位）如果不设置myLocationType，默认也会执行此种模式。
        myLocationStyle = new MyLocationStyle();
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER);
        //设置连续定位模式下的定位间隔，只在连续定位模式下生效，单次定位模式下不会生效。单位为毫秒。
        myLocationStyle.interval(2000);
        // 设置圆形的边框颜色 0不显示范围圆圈
        myLocationStyle.strokeColor(Color.rgb(18, 150, 219));
        // 设置圆形的填充颜色 0不显示范围圆圈
        myLocationStyle.radiusFillColor(0);
        // 设置定位蓝点的Style
        aMap.setMyLocationStyle(myLocationStyle);
    }

    /**
     * 设置地图的一些显示
     *
     * @param aMap AMap
     */
    public static void setMap(AMap aMap) {
        //地图的缩放级别一共分为 17 级，从 3 到 19。数字越大，展示的图面信息越精细。
        aMap.moveCamera(CameraUpdateFactory.zoomTo(15));
        //实例化UiSettings类对象
        UiSettings mUiSettings = aMap.getUiSettings();
        //显示默认的定位按钮
        mUiSettings.setMyLocationButtonEnabled(true);
    }


    /**
     * 初始化定位
     *
     * @param fragmentActivity     FragmentActivity
     * @param aMapLocationListener AMapLocationListener，设置定位回调监听：mLocationClient.setLocationListener(aMapLocationListener);
     * @return AMapLocationClient
     */
    public static AMapLocationClient initLocation(FragmentActivity fragmentActivity,
                                                  AMapLocationListener aMapLocationListener) {
        AMapLocationClient mLocationClient = null;
        //初始化定位
        try {
            mLocationClient = new AMapLocationClient(fragmentActivity.getApplicationContext());
        } catch (Exception e) {
            e.printStackTrace();
            Log.d(TAG, "initLocation: e=" + e);
        }
        if (mLocationClient != null) {
            //设置定位回调监听
            mLocationClient.setLocationListener(aMapLocationListener);
            //初始化AMapLocationClientOption对象
            AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
            //设置定位模式为AMapLocationMode.Hight_Accuracy，高精度模式。
            mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
            //获取最近3s内精度最高的一次定位结果：
            //设置setOnceLocationLatest(boolean b)接口为true，启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true，setOnceLocation(boolean b)接口也会被设置为true，反之不会，默认为false。
            mLocationOption.setOnceLocationLatest(true);
            //设置是否返回地址信息（默认返回地址信息）
            mLocationOption.setNeedAddress(true);
            //设置定位请求超时时间，单位是毫秒，默认30000毫秒，建议超时时间不要低于8000毫秒。
            mLocationOption.setHttpTimeOut(20000);
            //关闭缓存机制，高精度定位会产生缓存。
            mLocationOption.setLocationCacheEnable(false);
            //给定位客户端对象设置定位参数
            mLocationClient.setLocationOption(mLocationOption);
        }
        Log.d(TAG, "initLocation: mLocationClient=" + mLocationClient);
        return mLocationClient;
    }
}
